package com.tofacebook.proxy;

import com.tofacebook.proxy.impl.InvocationHandlerImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

@Slf4j
public class ProxyFactory {
    //代理类
    private Object proxyObject;

    public ProxyFactory(Object proxyObject) {
        this.proxyObject = proxyObject;
    }
    @Autowired
    private InvocationHandlerImpl invocationHandler;
    //构造我们代理类的实例
    public Object getProxyClass(){

        //通过反射机制调用静态的newProxyInstance()方法去构造我们对象实例
        /**
         * ClassLoader loader,类要被加载  就必须通过类的加载器去加载
         * class<?>[] interfaces, 获取目标接口的所有的集合
         * InvocationHandler h 意思是：执行处理，就要处理的实现类中的方法：即代理类如何去处理接口中的方法
         */
        ClassLoader classLoader = proxyObject.getClass().getClassLoader();
        System.out.println(classLoader);
        Class<?>[] interfaces = proxyObject.getClass().getInterfaces();
        System.out.println(interfaces[0]);
        InvocationHandler in = getInvocationHandler();
        return Proxy.newProxyInstance(classLoader,interfaces,in);
    }

    private InvocationHandler getInvocationHandler() {
        return new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    /**
                                     * proxy：代理对象
                                     * method：代理对象需要实现的方法，即其中需要重写的方法
                                     * args：method所对应方法的参数
                     */
                    Object result = null;
                    try {
                        log.info("操作之前，empId的值为：{}",args);
                        result = method.invoke(proxyObject, args);
                        log.info("操作之后，Emp对象的值为：{}",result);
                    } catch (Exception e) {
                        e.printStackTrace();

                    } finally {

                    }
                    return result;
                }
            };
    }
}
